package cn.jingyuan.bee.utils.getter;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Date;

/**
 * 基本类型的 getter 接口抽象实现<br>
 * 提供一个统一的接口定义返回不同类型的值（基本类型）<br>
 * 在不提供默认值的情况下， 如果值不存在或获取错误，返回 null<br>
 * 用户只需实现 {@link OptBasicTypeGetter} 接口即可
 */
public interface OptNullBasicTypeGetter<K> extends BasicTypeGetter<K>, OptBasicTypeGetter<K> {

    @Override
    default Object getObject(K key) {
        return getObject(key, null);
    }

    /**
     * 获取字符串型属性值<br>
     * 无值或获取错误返回 null
     *
     * @param key 属性名
     *
     * @return 属性值
     */
    @Override
    default String getString(K key) {
        return this.getString(key, null);
    }

    /**
     * 获取 int 型属性值<br>
     * 无值或获取错误返回 null
     *
     * @param key 属性名
     *
     * @return 属性值
     */
    @Override
    default Integer getInteger(K key) {
        return this.getInteger(key, null);
    }

    /**
     * 获取 short 型属性值<br>
     * 无值或获取错误返回 null
     *
     * @param key 属性名
     *
     * @return 属性值
     */
    @Override
    default Short getShort(K key) {
        return this.getShort(key, null);
    }

    /**
     * 获取 boolean 型属性值<br>
     * 无值或获取错误返回 null
     *
     * @param key 属性名
     *
     * @return 属性值
     */
    @Override
    default Boolean getBoolean(K key) {
        return this.getBoolean(key, null);
    }

    /**
     * 获取 long 型属性值<br>
     * 无值或获取错误返回 null
     *
     * @param key 属性名
     *
     * @return 属性值
     */
    @Override
    default Long getLong(K key) {
        return this.getLong(key, null);
    }

    /**
     * 获取 char 型属性值<br>
     * 无值或获取错误返回 null
     *
     * @param key 属性名
     *
     * @return 属性值
     */
    @Override
    default Character getCharacter(K key) {
        return this.getCharacter(key, null);
    }

    /**
     * 获取 float 型属性值<br>
     * 无值或获取错误返回 null
     *
     * @param key 属性名
     *
     * @return 属性值
     */
    @Override
    default Float getFloat(K key) {
        return this.getFloat(key, null);
    }

    /**
     * 获取 double 型属性值<br>
     * 无值或获取错误返回 null
     *
     * @param key 属性名
     *
     * @return 属性值
     */
    @Override
    default Double getDouble(K key) {
        return this.getDouble(key, null);
    }

    /**
     * 获取 byte 型属性值<br>
     * 无值或获取错误返回 null
     *
     * @param key 属性名
     *
     * @return 属性值
     */
    @Override
    default Byte getByte(K key) {
        return this.getByte(key, null);
    }

    /**
     * 获取 BigDecimal 型属性值<br>
     * 无值或获取错误返回 null
     *
     * @param key 属性名
     *
     * @return 属性值
     */
    @Override
    default BigDecimal getBigDecimal(K key) {
        return this.getBigDecimal(key, null);
    }

    /**
     * 获取 BigInteger 型属性值<br>
     * 无值或获取错误返回 null
     *
     * @param key 属性名
     *
     * @return 属性值
     */
    @Override
    default BigInteger getBigInteger(K key) {
        return this.getBigInteger(key, null);
    }

    /**
     * 获取 Enum 型属性值<br>
     * 无值或获取错误返回 null
     *
     * @param clazz Enum 的 Class
     * @param key 属性名
     *
     * @return 属性值
     */
    @Override
    default <E extends Enum<E>> E getEnum(Class<E> clazz, K key) {
        return this.getEnum(clazz, key, null);
    }

    /**
     * 获取 Date 型属性值<br>
     * 无值或获取错误返回 null
     *
     * @param key 属性名
     *
     * @return 属性值
     */
    @Override
    default Date getDate(K key) {
        return this.getDate(key, null);
    }

}
